#ifndef SEMANTICNODESIMULATION_H_
#define SEMANTICNODESIMULATION_H_

#include "SemanticNode.h"

#include "../main_container.h"

#include <string>
#include <sstream>
#include <vector>

extern MainContainer *compilerData;

class SemanticNodeExpression;

class SemanticNodeSimulation : public SemanticNode {
private:
	std::string name;
	std::vector<SemanticNode *> semanticStmts;

public:
	SemanticNodeSimulation(const SyntaxTreeNode *syntaxNode, SemanticNode *parent);
	~SemanticNodeSimulation();
	virtual std::string toDebugString(int tab);
};

class SemanticNodeSimConfiguration: public SemanticNode {
private:
	std::string name;
	std::vector<SemanticNodeExpression *> arguments;
public:
	SemanticNodeSimConfiguration(const SyntaxTreeNode *syntaxNode, SemanticNode *parent);
	~SemanticNodeSimConfiguration();
	virtual std::string toDebugString(int tab);
};

class SemanticNodeSimRun: public SemanticNode {
private:
	SemanticNodeExpression *expression;
	SemanticNodeExpression *uptoExpression;
public:
	SemanticNodeSimRun(const SyntaxTreeNode *syntaxNode, SemanticNode *parent);
	~SemanticNodeSimRun();
	virtual std::string toDebugString(int tab);
};

class SemanticNodeSimClear: public SemanticNode {
public:
	SemanticNodeSimClear(const SyntaxTreeNode *syntaxNode, SemanticNode *parent);
	~SemanticNodeSimClear();
	virtual std::string toDebugString(int tab);
};

class SemanticNodeSimReset: public SemanticNode {
public:
	SemanticNodeSimReset(const SyntaxTreeNode *syntaxNode, SemanticNode *parent);
	~SemanticNodeSimReset();
	virtual std::string toDebugString(int tab);
};

#endif /* SEMANTICNODESIMULATION_H_ */
